/*
[编程题]视野争夺(0.2)
time:20210318 21:58 PM
key:1.有一个bool数组，每次比较剩余视野守卫的范围与bool数组，挑出相差最大的，每轮都检查一次bool数组是不是被涂色涂完了，这里很多并列情况不知道怎么考虑，比如同样大的范围，同样相差最大。
user：ldc
*/

#include <iostream>
#include<iomanip>  
#include <iterator>
#include<stack>
#include<algorithm>
#include<queue>
#include<vector>
#include<math.h>
using namespace std;

int jiaoji(bool* flag, int l, int r)//返回lr能对数组补齐多少个
{
	int count = 0;
	for (int i = l; i <= r; i++)
	{
		if (flag[i] == 0)
		{
			count++;
		}
	}
	return count;
}
//最终检查整条数组
bool check(bool*color,int length)
{
	
	for (int i = 0; i < length; i++)
	{
		
		if (color[i] == 0)
		{
			return 1;
		}
	}
	return 0;
}
int main()
{

	//健身房
	vector<int>L;
	//公司
	vector<int>R;
	int i, j, n, x, length;
	cin >> n >> length;
	length++;
	int max = 0;
	int min = 10e9;
	int maxl_p = 0;
	int maxl_i = 0;
	for (i = 0; i < n; i++)
	{
		cin >> x;
		if (x < min)
		{
			min = x;
		}
		L.push_back(x);
		cin >> x;
		if (x > max)
		{
			max = x;
		}
		R.push_back(x);
		//有并列大的怎么办
		if (R[i] - L[i] >= maxl_p)
		{
			maxl_p = R[i] - L[i];
			maxl_i = i;
		}
	}
	//先检查左右端点是否能覆盖
	if (min != 0 || (max < length-1))
	{
		cout << -1;
	}
	else
	{/*
		//再检查中间是否能覆盖全面(空白格涂色法)
		bool* color = new bool[length];
		//初始化
		for (i = 0; i < length; i++)
		{
			//先全部弄成0
			color[i] = 0;
		}
		//每个边界图一轮循环
		for (i = 0; i < n; i++)
		{

			for (j = L[i]; j <= R[i]; j++)
			{
				color[j] = 1;
			}
		}
		//最终检查整条数组
		for (i = 0; i < length; i++)
		{
			//先全部弄成0
			if (color[i] == 0)
			{
				cout << -1;
				break;
			}
		}
	}*/
	//先更大范围去重，然后按最大范围的涂色，然后选已有涂色与剩余交集最少的那一个。
	//去重就是要比交集吧，先不去重

		bool* color = new bool[length];
		//初始化
		for (i = 0; i < length; i++)
		{
			//先全部弄成0
			color[i] = 0;
		}
		//第一个最大范围放入
		for (j = L[maxl_i]; j <= R[maxl_i]; j++)
		{
			color[j] = 1;
		}
		
		//范围失效
		L[maxl_i] = 0;
		R[maxl_i] = 0;
		int re;
		//cc统计视野守卫个数
		int cc = 1;
		
		while (check(color, length))
		{
			
			//所有边界中找交集最大
			re = 0;
			for (i = 0; i < n; i++)
			{
				if (jiaoji(color, L[i], R[i]) > re)
				{
					re = jiaoji(color, L[i], R[i]);
					maxl_i = i;
				}
			}
			//当前最大范围放入
			for (j = L[maxl_i]; j <= R[maxl_i]; j++)
			{
				color[j] = 1;
			}
			//范围失效
			L[maxl_i] = 0;
			R[maxl_i] = 0;
			//
			cc++;
		}
		cout << cc;
	}
}
